Commit b953d70d authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

Merge branch '10.2' into 10.3

parents 31d6e9c3 8a9cdc5f
Subproject commit 34f8887af03d022416dd6593de91d0706e57f46b Subproject commit 2c5aebb3bc724c1663c481ba2fedde00ab494fa4
...@@ -613,5 +613,16 @@ select count(*) from t1; ...@@ -613,5 +613,16 @@ select count(*) from t1;
count(*) count(*)
0 0
truncate table t1; truncate table t1;
### FIXME: update libmariadb select count(*) from t1;
count(*)
0
truncate table t1;
select count(*) from t1;
count(*)
41
truncate table t1;
select count(*) from t1;
count(*)
0
truncate table t1;
drop table t1; drop table t1;
...@@ -693,13 +693,12 @@ select count(*) from t1; truncate table t1; ...@@ -693,13 +693,12 @@ select count(*) from t1; truncate table t1;
--error 1 --error 1
--exec $MYSQL --disable-local-infile -e "$ldli" --exec $MYSQL --disable-local-infile -e "$ldli"
select count(*) from t1; truncate table t1; select count(*) from t1; truncate table t1;
--echo ### FIXME: update libmariadb --error 1
#--error 1 --exec $MYSQL -e "/*q*/$ldli"
#--exec $MYSQL -e "/*q*/$ldli" select count(*) from t1; truncate table t1;
#select count(*) from t1; truncate table t1; --exec $MYSQL --enable-local-infile -e "/*q*/$ldli"
#--exec $MYSQL --enable-local-infile -e "/*q*/$ldli" select count(*) from t1; truncate table t1;
#select count(*) from t1; truncate table t1; --error 1
# --error 1 --exec $MYSQL --disable-local-infile -e "/*q*/$ldli"
# --exec $MYSQL --disable-local-infile -e "/*q*/$ldli" select count(*) from t1; truncate table t1;
#select count(*) from t1; truncate table t1;
drop table t1; drop table t1;
...@@ -9,6 +9,7 @@ innodb-autoinc-lock-mode=2 ...@@ -9,6 +9,7 @@ innodb-autoinc-lock-mode=2
default-storage-engine=innodb default-storage-engine=innodb
wsrep_gtid_mode=1 wsrep_gtid_mode=1
gtid_ignore_duplicates gtid_ignore_duplicates
auto_increment_increment=3
wsrep-on=1 wsrep-on=1
wsrep-provider=@ENV.WSREP_PROVIDER wsrep-provider=@ENV.WSREP_PROVIDER
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
binlog-format=row binlog-format=row
innodb-autoinc-lock-mode=2 innodb-autoinc-lock-mode=2
default-storage-engine=innodb default-storage-engine=innodb
auto_increment_increment=3
wsrep-on=1 wsrep-on=1
wsrep-provider=@ENV.WSREP_PROVIDER wsrep-provider=@ENV.WSREP_PROVIDER
......
connection node_1;
connection node_2;
connection node_3;
Killing node #3 to free ports for garbd ... Killing node #3 to free ports for garbd ...
connection node_3;
connection node_1; connection node_1;
Starting garbd ... Starting garbd ...
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
......
...@@ -11,15 +11,8 @@ connection node_1; ...@@ -11,15 +11,8 @@ connection node_1;
include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0'] include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0']
include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0'] include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0']
include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0'] include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0']
<<<<<<< HEAD
connection node_3; connection node_3;
connection node_1; connection node_1;
||||||| merged common ancestors
=======
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3;
connection node_1;
>>>>>>> 10.2
include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0'] include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0']
include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0'] include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 0']
include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 1'] include/assert_grep.inc [grastate.dat does not have 'safe_to_bootstrap: 1']
...@@ -35,7 +28,6 @@ Killing server ... ...@@ -35,7 +28,6 @@ Killing server ...
safe_to_bootstrap: 1 safe_to_bootstrap: 1
safe_to_bootstrap: 0 safe_to_bootstrap: 0
safe_to_bootstrap: 0 safe_to_bootstrap: 0
<<<<<<< HEAD
connection node_1; connection node_1;
connection node_2; connection node_2;
connection node_3; connection node_3;
...@@ -45,25 +37,13 @@ CALL mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster fro ...@@ -45,25 +37,13 @@ CALL mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster fro
CALL mtr.add_suppression("WSREP: wsrep::connect(.*) failed: 7"); CALL mtr.add_suppression("WSREP: wsrep::connect(.*) failed: 7");
CALL mtr.add_suppression("Aborting"); CALL mtr.add_suppression("Aborting");
CALL mtr.add_suppression("WSREP: moving position backwards: [0-9]+ -> 0"); CALL mtr.add_suppression("WSREP: moving position backwards: [0-9]+ -> 0");
||||||| merged common ancestors
=======
connection node_1;
connection node_2;
connection node_3;
connection node_2;
>>>>>>> 10.2
CALL mtr.add_suppression("Failed to prepare for incremental state transfer"); CALL mtr.add_suppression("Failed to prepare for incremental state transfer");
<<<<<<< HEAD
connection node_3; connection node_3;
CALL mtr.add_suppression("WSREP: no nodes coming from prim view, prim not possible"); CALL mtr.add_suppression("WSREP: no nodes coming from prim view, prim not possible");
CALL mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node"); CALL mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node");
CALL mtr.add_suppression("WSREP: wsrep::connect(.*) failed: 7"); CALL mtr.add_suppression("WSREP: wsrep::connect(.*) failed: 7");
CALL mtr.add_suppression("Aborting"); CALL mtr.add_suppression("Aborting");
CALL mtr.add_suppression("WSREP: moving position backwards: [0-9]+ -> 0"); CALL mtr.add_suppression("WSREP: moving position backwards: [0-9]+ -> 0");
||||||| merged common ancestors
=======
connection node_3;
>>>>>>> 10.2
CALL mtr.add_suppression("Failed to prepare for incremental state transfer"); CALL mtr.add_suppression("Failed to prepare for incremental state transfer");
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
......
connection node_1;
connection node_2;
connection node_3;
connection node_1;
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
connection node_2; connection node_2;
......
...@@ -49,25 +49,14 @@ push @::global_suppressions, ...@@ -49,25 +49,14 @@ push @::global_suppressions,
qr|WSREP: discarding established \(time wait\) .*|, qr|WSREP: discarding established \(time wait\) .*|,
qr(WSREP: There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside. Will use that one.), qr(WSREP: There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside. Will use that one.),
qr(WSREP: evs::proto.*), qr(WSREP: evs::proto.*),
<<<<<<< HEAD
qr|WSREP: Ignoring possible split-brain \(allowed by configuration\) from view:.*|, qr|WSREP: Ignoring possible split-brain \(allowed by configuration\) from view:.*|,
||||||| merged common ancestors
qr|WSREP: Ignoring possible split-brain (allowed by configuration) from view:.*|,
=======
qr|WSREP: Ignoring possible split-brain \(allowed by configuration\) from view:.*|, qr|WSREP: Ignoring possible split-brain \(allowed by configuration\) from view:.*|,
qr(WSREP: no nodes coming from prim view, prim not possible), qr(WSREP: no nodes coming from prim view, prim not possible),
>>>>>>> 10.2
qr(WSREP: Member .* requested state transfer from .* but it is impossible to select State Transfer donor: Resource temporarily unavailable), qr(WSREP: Member .* requested state transfer from .* but it is impossible to select State Transfer donor: Resource temporarily unavailable),
<<<<<<< HEAD
qr(WSREP: .* sending install message failed: Transport endpoint is not connected),
qr(WSREP: .* sending install message failed: Resource temporarily unavailable),
||||||| merged common ancestors
=======
qr(WSREP: user message in state LEAVING), qr(WSREP: user message in state LEAVING),
qr(WSREP: .* sending install message failed: Transport endpoint is not connected), qr(WSREP: .* sending install message failed: Transport endpoint is not connected),
qr(WSREP: .* sending install message failed: Resource temporarily unavailable), qr(WSREP: .* sending install message failed: Resource temporarily unavailable),
qr(WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.), qr(WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.),
>>>>>>> 10.2
qr(WSREP: Could not find peer:), qr(WSREP: Could not find peer:),
qr|WSREP: gcs_caused\(\) returned .*|, qr|WSREP: gcs_caused\(\) returned .*|,
qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(SYNCED\). Message ignored.|, qr|WSREP: Protocol violation. JOIN message sender .* is not in state transfer \(SYNCED\). Message ignored.|,
...@@ -80,30 +69,6 @@ push @::global_suppressions, ...@@ -80,30 +69,6 @@ push @::global_suppressions,
$ENV{PATH}="$epath:$ENV{PATH}"; $ENV{PATH}="$epath:$ENV{PATH}";
$ENV{PATH}="$spath:$ENV{PATH}" unless $epath eq $spath; $ENV{PATH}="$spath:$ENV{PATH}" unless $epath eq $spath;
<<<<<<< HEAD
$ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath;
$ENV{PATH}="$bpath:$ENV{PATH}" unless $bpath eq $spath;
if (which(socat)) {
$ENV{MTR_GALERA_TFMT}='socat';
} elsif (which(nc)) {
$ENV{MTR_GALERA_TFMT}='nc';
}
sub skip_combinations {
my %skip = ();
$skip{'include/have_filekeymanagement.inc'} = 'needs file_key_management plugin'
unless $ENV{FILE_KEY_MANAGEMENT_SO};
$skip{'include/have_mariabackup.inc'} = 'Need mariabackup'
unless which(mariabackup);
$skip{'include/have_mariabackup.inc'} = 'Need ss'
unless which(ss);
$skip{'include/have_mariabackup.inc'} = 'Need socat or nc'
unless $ENV{MTR_GALERA_TFMT};
%skip;
}
||||||| merged common ancestors
=======
$ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath; $ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath;
$ENV{PATH}="$bpath:$ENV{PATH}" unless $bpath eq $spath; $ENV{PATH}="$bpath:$ENV{PATH}" unless $bpath eq $spath;
...@@ -125,7 +90,6 @@ sub skip_combinations { ...@@ -125,7 +90,6 @@ sub skip_combinations {
unless $ENV{MTR_GALERA_TFMT}; unless $ENV{MTR_GALERA_TFMT};
%skip; %skip;
} }
>>>>>>> 10.2
bless { }; bless { };
...@@ -7,10 +7,17 @@ ...@@ -7,10 +7,17 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/big_test.inc --source include/big_test.inc
--echo Killing node #3 to free ports for garbd ...
--let $galera_connection_name = node_3 --let $galera_connection_name = node_3
--let $galera_server_number = 3 --let $galera_server_number = 3
--source include/galera_connect.inc --source include/galera_connect.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
--echo Killing node #3 to free ports for garbd ...
--connection node_3
--let $gp3 = `SELECT SUBSTR(@@wsrep_provider_options, LOCATE('base_port =', @@wsrep_provider_options) + LENGTH('base_port = '))` --let $gp3 = `SELECT SUBSTR(@@wsrep_provider_options, LOCATE('base_port =', @@wsrep_provider_options) + LENGTH('base_port = '))`
--let $galera_port_3 = `SELECT SUBSTR('$gp3', 1, LOCATE(';', '$gp3') - 1)` --let $galera_port_3 = `SELECT SUBSTR('$gp3', 1, LOCATE(';', '$gp3') - 1)`
--source include/shutdown_mysqld.inc --source include/shutdown_mysqld.inc
...@@ -55,6 +62,8 @@ DROP TABLE t1; ...@@ -55,6 +62,8 @@ DROP TABLE t1;
--connection node_3 --connection node_3
--source include/start_mysqld.inc --source include/start_mysqld.inc
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
# Workaround for galera#101 # Workaround for galera#101
......
...@@ -5,6 +5,17 @@ ...@@ -5,6 +5,17 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--let $galera_connection_name = node_3
--let $galera_server_number = 3
--source include/galera_connect.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--let $node_3=node_3
--source ../galera/include/auto_increment_offset_save.inc
--connection node_1
CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER);
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
...@@ -110,3 +121,6 @@ SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; ...@@ -110,3 +121,6 @@ SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
--source include/wait_condition.inc --source include/wait_condition.inc
DROP TABLE t1; DROP TABLE t1;
# Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
...@@ -238,6 +238,16 @@ ALTER TABLE t1 ADD FULLTEXT INDEX ft2 (f); ...@@ -238,6 +238,16 @@ ALTER TABLE t1 ADD FULLTEXT INDEX ft2 (f);
Warnings: Warnings:
Warning 1088 failed to load FOREIGN KEY constraints Warning 1088 failed to load FOREIGN KEY constraints
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (f VARCHAR(256), FTS_DOC_ID BIGINT UNSIGNED PRIMARY KEY)
ENGINE=InnoDB;
SET SESSION FOREIGN_KEY_CHECKS = OFF;
ALTER TABLE t1 ADD FOREIGN KEY (f) REFERENCES non_existing_table (x);
SET SESSION FOREIGN_KEY_CHECKS = ON;
ALTER TABLE t1 ADD FULLTEXT INDEX ft1 (f);
Warnings:
Warning 1088 failed to load FOREIGN KEY constraints
ALTER TABLE t1 ADD FULLTEXT INDEX ft2 (f);
DROP TABLE t1;
# Start of 10.2 tests # Start of 10.2 tests
# #
# MDEV-13246 Stale rows despite ON DELETE CASCADE constraint # MDEV-13246 Stale rows despite ON DELETE CASCADE constraint
......
...@@ -221,6 +221,15 @@ ALTER TABLE t1 ADD FULLTEXT INDEX ft1 (f); ...@@ -221,6 +221,15 @@ ALTER TABLE t1 ADD FULLTEXT INDEX ft1 (f);
ALTER TABLE t1 ADD FULLTEXT INDEX ft2 (f); ALTER TABLE t1 ADD FULLTEXT INDEX ft2 (f);
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (f VARCHAR(256), FTS_DOC_ID BIGINT UNSIGNED PRIMARY KEY)
ENGINE=InnoDB;
SET SESSION FOREIGN_KEY_CHECKS = OFF;
ALTER TABLE t1 ADD FOREIGN KEY (f) REFERENCES non_existing_table (x);
SET SESSION FOREIGN_KEY_CHECKS = ON;
ALTER TABLE t1 ADD FULLTEXT INDEX ft1 (f);
ALTER TABLE t1 ADD FULLTEXT INDEX ft2 (f);
DROP TABLE t1;
--echo # Start of 10.2 tests --echo # Start of 10.2 tests
--echo # --echo #
......
...@@ -1814,7 +1814,7 @@ PCSZ ha_connect::GetDBName(PCSZ name) ...@@ -1814,7 +1814,7 @@ PCSZ ha_connect::GetDBName(PCSZ name)
const char *ha_connect::GetTableName(void) const char *ha_connect::GetTableName(void)
{ {
const char *path= tshp ? tshp->path.str : table_share->path.str; const char *path= tshp ? tshp->path.str : table_share->path.str;
const char *name= strrchr(path, '/'); const char *name= strrchr(path, slash);
return name ? name+1 : path; return name ? name+1 : path;
} // end of GetTableName } // end of GetTableName
......
...@@ -323,7 +323,7 @@ HEX(c) 3F3F3F3F3F3F3F ...@@ -323,7 +323,7 @@ HEX(c) 3F3F3F3F3F3F3F
Warnings: Warnings:
Level Warning Level Warning
Code 1366 Code 1366
Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column 'c' at row 1 Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column `test`.`t1`.`c` at row 1
Level Warning Level Warning
Code 1105 Code 1105
Message Out of range value ÁÂÃÄÅÆÇ for column 'c' at row 1 Message Out of range value ÁÂÃÄÅÆÇ for column 'c' at row 1
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2014, 2018, MariaDB Corporation. Copyright (c) 2014, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -9033,10 +9033,12 @@ i_s_innodb_mutexes_fill_table( ...@@ -9033,10 +9033,12 @@ i_s_innodb_mutexes_fill_table(
} }
OK(field_store_string(fields[MUTEXES_NAME], mutex->cmutex_name)); OK(field_store_string(fields[MUTEXES_NAME], mutex->cmutex_name));
OK(field_store_string(fields[MUTEXES_CREATE_FILE], innobase_basename(mutex->cfile_name))); OK(field_store_string(fields[MUTEXES_CREATE_FILE],
OK(fields[MUTEXES_CREATE_LINE]->store(mutex->cline, true)); innobase_basename(mutex->cfile_name)));
OK(fields[MUTEXES_CREATE_LINE]->store(lock->cline, true));
fields[MUTEXES_CREATE_LINE]->set_notnull(); fields[MUTEXES_CREATE_LINE]->set_notnull();
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)mutex->count_os_wait)); OK(fields[MUTEXES_OS_WAITS]->store(lock->count_os_wait, true));
fields[MUTEXES_OS_WAITS]->set_notnull();
OK(schema_table_store_record(thd, tables->table)); OK(schema_table_store_record(thd, tables->table));
} }
...@@ -9057,7 +9059,12 @@ i_s_innodb_mutexes_fill_table( ...@@ -9057,7 +9059,12 @@ i_s_innodb_mutexes_fill_table(
mutex_exit(&mutex_list_mutex); mutex_exit(&mutex_list_mutex);
#endif /* JAN_TODO_FIXME */ #endif /* JAN_TODO_FIXME */
mutex_enter(&rw_lock_list_mutex); {
struct Locking
{
Locking() { mutex_enter(&rw_lock_list_mutex); }
~Locking() { mutex_exit(&rw_lock_list_mutex); }
} locking;
for (lock = UT_LIST_GET_FIRST(rw_lock_list); lock != NULL; for (lock = UT_LIST_GET_FIRST(rw_lock_list); lock != NULL;
lock = UT_LIST_GET_NEXT(list, lock)) { lock = UT_LIST_GET_NEXT(list, lock)) {
...@@ -9071,11 +9078,17 @@ i_s_innodb_mutexes_fill_table( ...@@ -9071,11 +9078,17 @@ i_s_innodb_mutexes_fill_table(
continue; continue;
} }
//OK(field_store_string(fields[MUTEXES_NAME], lock->lock_name)); //OK(field_store_string(fields[MUTEXES_NAME],
OK(field_store_string(fields[MUTEXES_CREATE_FILE], innobase_basename(lock->cfile_name))); // lock->lock_name));
OK(fields[MUTEXES_CREATE_LINE]->store(lock->cline, true)); OK(field_store_string(
fields[MUTEXES_CREATE_FILE],
innobase_basename(lock->cfile_name)));
OK(fields[MUTEXES_CREATE_LINE]->store(lock->cline,
true));
fields[MUTEXES_CREATE_LINE]->set_notnull(); fields[MUTEXES_CREATE_LINE]->set_notnull();
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)lock->count_os_wait)); OK(fields[MUTEXES_OS_WAITS]->store(lock->count_os_wait,
true));
fields[MUTEXES_OS_WAITS]->set_notnull();
OK(schema_table_store_record(thd, tables->table)); OK(schema_table_store_record(thd, tables->table));
} }
...@@ -9085,15 +9098,19 @@ i_s_innodb_mutexes_fill_table( ...@@ -9085,15 +9098,19 @@ i_s_innodb_mutexes_fill_table(
snprintf(buf1, sizeof buf1, "combined %s", snprintf(buf1, sizeof buf1, "combined %s",
innobase_basename(block_lock->cfile_name)); innobase_basename(block_lock->cfile_name));
//OK(field_store_string(fields[MUTEXES_NAME], block_lock->lock_name)); //OK(field_store_string(fields[MUTEXES_NAME],
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1)); // block_lock->lock_name));
OK(fields[MUTEXES_CREATE_LINE]->store(block_lock->cline, true)); OK(field_store_string(fields[MUTEXES_CREATE_FILE],
buf1));
OK(fields[MUTEXES_CREATE_LINE]->store(block_lock->cline,
true));
fields[MUTEXES_CREATE_LINE]->set_notnull(); fields[MUTEXES_CREATE_LINE]->set_notnull();
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)block_lock_oswait_count)); OK(fields[MUTEXES_OS_WAITS]->store(
block_lock_oswait_count, true));
fields[MUTEXES_OS_WAITS]->set_notnull();
OK(schema_table_store_record(thd, tables->table)); OK(schema_table_store_record(thd, tables->table));
} }
}
mutex_exit(&rw_lock_list_mutex);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment